#include "ConfigService.h"
#include "config/AppConfig.h"
#include "log.h"
#include "ScreenshotService.h"

ConfigService::ConfigService(QObject *parent)
    : QObject(parent)
{
    connectAppConfigSignals();
    logInfo("ConfigService 初始化完成");
}

ConfigService::~ConfigService()
{
    logInfo("ConfigService 销毁");
}

ConfigService& ConfigService::instance()
{
    static ConfigService instance;
    return instance;
}

void ConfigService::connectAppConfigSignals()
{
    // 连接AppConfig的信号，转发出去
    connect(&AppConfig::getInstance(), &AppConfig::sigDataChange,
            this, &ConfigService::configChanged);
}

// ========== 计时器配置 ==========

TimerConfig ConfigService::getTimerConfig() const
{
    return AppConfig::getInstance().getTimer();
}

bool ConfigService::setTimerConfig(const TimerConfig& config)
{
    // 验证配置
    QString errorMsg;
    if (!validateTimerConfig(config, &errorMsg)) {
            logError("计时器配置无效: " << errorMsg);
        return false;
    }

    // 设置配置
    AppConfig::getInstance().setTimer(config);
    AppConfig::getInstance().UpdatData();
    
    emit timerConfigChanged(config);
    logInfo("计时器配置已更新");
    return true;
}

// ========== 时间格式 ==========

TimeFormat ConfigService::getTimeFormat() const
{
    return AppConfig::getInstance().getTimeFormat();
}

void ConfigService::setTimeFormat(TimeFormat format)
{
    AppConfig::getInstance().setTimeFormat(format);
    AppConfig::getInstance().UpdatData();
    logInfo("时间格式已更新");
}

// ========== 超时动作 ==========

TimeoutAction ConfigService::getTimeoutAction() const
{
    return AppConfig::getInstance().getTimeoutAction();
}

void ConfigService::setTimeoutAction(const TimeoutAction& action)
{
    AppConfig::getInstance().setTimeoutAction(action);
    AppConfig::getInstance().UpdatData();
    logInfo("超时动作已更新");
}

// ========== 播放设置 ==========

PlaybackSettings ConfigService::getPlaybackSettings() const
{
    return AppConfig::getInstance().getPlayback();
}

void ConfigService::setPlaybackSettings(const PlaybackSettings& settings)
{
    AppConfig::getInstance().setPlayback(settings);
    AppConfig::getInstance().UpdatData();
    logInfo("播放设置已更新");
}

// ========== 背景设置 ==========

BackgroundSettings ConfigService::getBackgroundSettings() const
{
    return AppConfig::getInstance().getBackground();
}

void ConfigService::setBackgroundSettings(const BackgroundSettings& settings)
{
    AppConfig::getInstance().setBackground(settings);
    AppConfig::getInstance().UpdatData();
    logInfo("背景设置已更新");
}

// ========== 音频设置 ==========

SoundSettings ConfigService::getSoundSettings() const
{
    return AppConfig::getInstance().getSound();
}

void ConfigService::setSoundSettings(const SoundSettings& settings)
{
    AppConfig::getInstance().setSound(settings);
    AppConfig::getInstance().UpdatData();
    logInfo("音频设置已更新");
}

// ===== Global sound controls =====
bool ConfigService::getGlobalMuted() const { return AppConfig::getInstance().getGlobalMuted(); }
void ConfigService::setGlobalMuted(bool m) { AppConfig::getInstance().setGlobalMuted(m); AppConfig::getInstance().UpdatData(); }
int ConfigService::getGlobalVolume() const { return AppConfig::getInstance().getGlobalVolume(); }
void ConfigService::setGlobalVolume(int v) { AppConfig::getInstance().setGlobalVolume(v); AppConfig::getInstance().UpdatData(); }
bool ConfigService::getTickEnable() const { return AppConfig::getInstance().getTickEnable(); }
void ConfigService::setTickEnable(bool en) { AppConfig::getInstance().setTickEnable(en); AppConfig::getInstance().UpdatData(); }
int ConfigService::getTickIntervalMs() const { return AppConfig::getInstance().getTickIntervalMs(); }
void ConfigService::setTickIntervalMs(int ms) { AppConfig::getInstance().setTickIntervalMs(ms); AppConfig::getInstance().UpdatData(); }

// ========== 字体设置 ==========

QFont ConfigService::getFont() const
{
    return AppConfig::getInstance().getFont();
}

void ConfigService::setFont(const QFont& font)
{
    AppConfig::getInstance().setFont(font);
    AppConfig::getInstance().UpdatData();
    emit fontChanged(font);
    logInfo("字体已更新: " << font.family() << ", " << font.pointSize() << "pt");
}

// ========== 配置管理 ==========

void ConfigService::saveConfig()
{
    AppConfig::getInstance().UpdatData();
    logInfo("配置已保存");
}

void ConfigService::reloadConfig()
{
    // AppConfig是单例，会自动从文件加载
    // 这里只需要通知刷新
    emit configChanged();
    logInfo("配置已重新加载");
}

void ConfigService::resetToDefaults()
{
    // 重置为默认值
    TimerConfig defaultTimer;
    AppConfig::getInstance().setTimer(defaultTimer);
    
    TimeoutAction defaultAction;
    AppConfig::getInstance().setTimeoutAction(defaultAction);
    
    AppConfig::getInstance().UpdatData();
    
    emit configChanged();
    logInfo("配置已重置为默认值");
}

// ========== 配置验证 ==========

bool ConfigService::validateTimerConfig(const TimerConfig& config, QString* errorMsg) const
{
    // 验证计时时长
    if (config.isTimerEnabled && config.durationMs <= 0) {
        if (errorMsg) {
            *errorMsg = "计时时长必须大于0";
        }
        return false;
    }

    // 验证报警时间
    if (config.isAlarm1Enabled && config.alarm1Ms < 0) {
        if (errorMsg) {
            *errorMsg = "报警1时间不能为负数";
        }
        return false;
    }

    if (config.isAlarm2Enabled && config.alarm2Ms < 0) {
        if (errorMsg) {
            *errorMsg = "报警2时间不能为负数";
        }
        return false;
    }

    if (config.isAlarm3Enabled && config.alarm3Ms < 0) {
        if (errorMsg) {
            *errorMsg = "报警3时间不能为负数";
        }
        return false;
    }

    // 验证报警时间顺序（倒计时模式）
    if (config.mode == TimerMode::Countdown) {
        if (config.isAlarm1Enabled && config.alarm1Ms > config.durationMs) {
            if (errorMsg) {
                *errorMsg = "报警1时间不能大于总时长";
            }
            return false;
        }

        if (config.isAlarm2Enabled && config.alarm2Ms > config.durationMs) {
            if (errorMsg) {
                *errorMsg = "报警2时间不能大于总时长";
            }
            return false;
        }

        if (config.isAlarm3Enabled && config.alarm3Ms > config.durationMs) {
            if (errorMsg) {
                *errorMsg = "报警3时间不能大于总时长";
            }
            return false;
        }
    }

    // 验证超时时间
    if (config.isTimeoutEnabled && config.timeoutMs < 0) {
        if (errorMsg) {
            *errorMsg = "超时时间不能为负数";
        }
        return false;
    }

    return true;
}

// ========== 截图设置 ==========
ScreenshotConfig ConfigService::getScreenshotConfig() const
{
    return AppConfig::getInstance().getScreenshotConfig();
}

void ConfigService::setScreenshotConfig(const ScreenshotConfig& cfg)
{
    AppConfig::getInstance().setScreenshotConfig(cfg);
    AppConfig::getInstance().UpdatData();
    // 同步到运行时截图服务
    ScreenshotService::instance().setConfig(cfg);
    emit configChanged();
}

// ========== [FDD-2025-03-015][AC-002][AC-003] Task Panel State ==========

bool ConfigService::getTaskPanelExpanded() const
{
    return AppConfig::getInstance().getTaskPanelExpanded();
}

void ConfigService::setTaskPanelExpanded(bool expanded)
{
    AppConfig::getInstance().setTaskPanelExpanded(expanded);
    AppConfig::getInstance().saveConfig();
    emit configChanged();
}
